package org.zoomdev.zoom.dao.alias.impl;

import org.zoomdev.zoom.dao.alias.NameMapping;
import org.zoomdev.zoom.dao.alias.NameMappingFactory;

import java.util.HashSet;

/**
 * 自动检测字段的前缀，并以驼峰式来重命名 {@link NameMappingFactory}
 * 策略是：
 * 所谓前缀：是第一个下划线前面的部分加上下划线，比如TP_ID,前缀为TP_
 * 以第一个字段出现的前缀作为全部字段的前缀，还有个前提是这个前缀出现的次数最多
 * <p>
 * 当第一个前缀
 *
 * @author jzoom
 */
public final class DetectPrefixNameMappingFactory implements NameMappingFactory {

    public static final NameMappingFactory DEFAULT = new DetectPrefixNameMappingFactory();


    private DetectPrefixNameMappingFactory() {

    }

    // 这个逻辑如果数据库字段比较规范是够用的，不够再说
    @Override
    public NameMapping create(String[] names) {
        int index = 0;
        String key = null;
        int count = 0;
        for (String name : names) {
            String[] arr = name.split("_");
            if (arr.length <= 1) {
                if (index == 0) {
                    return CamelNameMapping.DEFAULT;
                }
                continue;
            }

            String prefixThisColumn = arr[0];
            if (index == 0) {
                key = prefixThisColumn;
            } else {
                if (key.equals(prefixThisColumn)) {
                    ++count;
                    if (count >= 1) {
                        String prefix = key + "_";
                        if (!check(prefix, names)) {
                            break;
                        }
                        return new PrefixNameMapping(key + "_");
                    }
                }
            }
            ++index;
        }


        return CamelNameMapping.DEFAULT;
    }

    private boolean check(String prefix, String[] columnNames) {

        HashSet<String> set = new HashSet<>();
        for (String column : columnNames) {
            if (column.startsWith(prefix)) {
                column = column.substring(prefix.length());
            }
            set.add(column);
        }

        return set.size() == columnNames.length;
    }

}
